using namespace std;

//---------------------------------------------------- 28
#include <iostream>
#include <complex>
#include <memory> // std::allocator
#include <ext\pool_allocator.h> // 使用 std:: allocator 以外的 allocator，得自行 #include <ext\...>
namespace mm01 {
void test_primitives() {
    cout << "\ntest_primitives().......... " << endl;

    void* p1 = malloc(512); // 512 bytes
    free(p1);

    complex<int>* p2 = new complex<int>; // 1 obj
    delete p2;

    void* p3 = ::operator new(512); // 512 bytes
    ::operator delete(p3);

// 以下使用 C++ 标准库提供的 allocators
// 其接口虽有标准规格，但实现厂商并未完全遵守，下面三者形式各异：
#ifdef _MSC_VER
    // 以下两函数都是 non-static，定要通过 object 调用。以下分配 3 个 ints
    int* p4 = allocator<int>().allocate(3, (int*)0);
    allocator<int>().deallocate(p4, 3);
#endif
#ifdef __BORLANDC__
    // 以下两个函数都是 non-static，定要通过 object 调用。以下分配 5 个 ints
    int* p4 = allocator<int>().allocate(5);
    allocator<int>().deallocate(p4, 5);
#endif
#ifdef __GNUC__
    // 以下两个函数都是 static，可通过全名调用。以下分配 512 bytes
    // void* p4 = alloc::allocate(512);
    // alloc::deallocate(p4, 512);

    // 以下两个函数都是 non-static，定要通过 object 调用。以下分配 7 个 ints
    void* p4 = allocator<int>().allocate(7);
    allocator<int>().deallocate((int*)p4, 7);

    // 以下两个函数都是 non-static，定要通过 object 调用。以下分配 9 个 ints
    void* p5 = __gnu_cxx::__pool_alloc<int>().allocate(9);
    __gnu_cxx::__pool_alloc<int>().deallocate((int*)p5, 9);
#endif
}
}
//---------------------------------------------------- 75
#include <iostream>
#include <string>
#include <memory>
namespace mm02 {
class A {
public:
    int id;

    A() : id(0)      { cout << "default ctor. this="  << this << " id=" << id << endl;  }
    A(int i) : id(i) { cout << "ctor. this="  << this << " id=" << id << endl;  }
    ~A()             { cout << "dtor. this="  << this << " id=" << id << endl;  }
};
void test_call_ctor_directly()
{
	cout << "\ntest_call_ctor_directly().........." << endl;
    
}
}

//---------------------------------------------------- 1627
int main(int argc, char const *argv[])
{
    cout << __cplusplus << endl;

    mm01::test_primitives();
    return 0;
}
